package com.jdkreader.object;

/**
 * 克隆方法原理
 *
 * @author zhaoyiwu
 * @create 2017-09-29 15:43
 **/
public class CloneCode {

    public static void main(String[] args) {

            shallowCopy();
            deepCopy();

    }


    /**
     * 浅拷贝 1.对象类型拷贝的是地址引用，原对象改变后，拷贝对象随之改变
     *       2.基本类型，拷贝的是其值,原对象改变，拷贝对象不变
     *       3.字符串，拷贝的是其引用，但是修改时，重新创建对象并进行修改，拷贝对象的值不变
     */
    private static void shallowCopy(){

        System.out.println("---------开始浅拷贝----------");
        try {
            //写封邮件
            Email email = new Email("请参加会议", "请于今天12:30到二会议室参加会议...");
            Person person1 = new Person("张三", email);
            Person person2 = (Person) person1.clone();
            person2.setName("李四");
            Person person3 = (Person) person1.clone();
           person3.setName("王五");
            System.out.println(person1.getName() + "的邮件内容是：" + person1.getEmail().getContent());
            System.out.println(person2.getName() + "的邮件内容是：" + person2.getEmail().getContent());
            System.out.println(person3.getName() + "的邮件内容是：" + person3.getEmail().getContent());

            person1.setName("王二");
            person1.getEmail().setContent("请于今天13:30到二会议室参加会议...");
            System.out.println(person1.getName() + "的邮件内容是：" + person1.getEmail().getContent());
            System.out.println(person2.getName() + "的邮件内容是：" + person2.getEmail().getContent());
            System.out.println(person3.getName() + "的邮件内容是：" + person3.getEmail().getContent());
        }catch(Exception e){
            e.printStackTrace();
        }
        System.out.println("---------浅拷贝结束----------");
    }

    /**
     * 深拷贝 将原对象写入字节流，再从字节流写入待拷贝的对象
     */
    private static void deepCopy(){

        System.out.println("---------开始深拷贝----------");
        //写封邮件
        Email email = new Email("请参加会议", "请于今天12:30到二会议室参加会议...");
        Person person1 = new Person("张三", email);
        Person person2 =  CloneUtil.clone(person1);
        person2.setName("李四");
        Person person3 = CloneUtil.clone(person1);
        person3.setName("王五");
        System.out.println(person1.getName() + "的邮件内容是：" + person1.getEmail().getContent());
        System.out.println(person2.getName() + "的邮件内容是：" + person2.getEmail().getContent());
        System.out.println(person3.getName() + "的邮件内容是：" + person3.getEmail().getContent());

        person1.setName("王二");
        person1.getEmail().setContent("请于今天13:30到二会议室参加会议...");
        System.out.println(person1.getName() + "的邮件内容是：" + person1.getEmail().getContent());
        System.out.println(person2.getName() + "的邮件内容是：" + person2.getEmail().getContent());
        System.out.println(person3.getName() + "的邮件内容是：" + person3.getEmail().getContent());

        System.out.println("---------深拷贝结束----------");

    }




}
